package org.fujay.langchain4jserver.domain.application.repository;

import org.fujay.langchain4jserver.domain.application.aggregate.AppAggregate;
import org.fujay.langchain4jserver.domain.application.entity.AppConfigHistory;
import org.fujay.langchain4jserver.domain.application.entity.AppUsageStats;
import org.fujay.langchain4jserver.domain.application.vo.AppId;
import org.fujay.langchain4jserver.domain.model.vo.ModelId;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.util.List;
import java.util.Optional;

/**
 * 应用仓储接口
 */
public interface AppRepository {

    /**
     * 根据ID查找应用聚合根 (包含完整信息，如配置历史)
     *
     * @param id 应用ID
     * @return 应用聚合根 Optional
     */
    Optional<AppAggregate> findById(AppId id);

    /**
     * 查找所有应用 (通常为浅加载，不包含历史等详细信息)
     *
     * @return 应用聚合根列表
     */
    List<AppAggregate> findAll();

    /**
     * 查找应用概要信息，不包含应用历史配置
     */
    Optional<AppAggregate> findAppShallow(AppId appId);

    /**
     * 保存应用聚合根 (包括其内部状态和关联对象)
     *
     * @param aggregate 应用聚合根
     */
    void save(AppAggregate aggregate);

    /**
     * 根据ID删除应用 (包括关联数据，如历史记录)
     *
     * @param id 应用ID
     */
    void deleteById(AppId id);

    List<AppConfigHistory> listHistoryByAppId(AppId appId);

    @Transactional
    void saveStats(AppUsageStats stats);

    List<AppUsageStats> queryStats(AppId appId, LocalDate startDate, LocalDate endDate);

    boolean existsById(AppId id);

    /**
     * Finds all Application Aggregates optimized for summary display. Should load only necessary data
     * (e.g., App entity without full history).
     *
     * @return A list of Application Aggregates with limited data.
     */
    List<AppAggregate> findAllShallow();

    /**
     * 根据模型ID统计使用该模型的应用数量
     *
     * @param modelId 模型ID
     * @return 使用该模型的应用数量
     */
    long countByModelId(ModelId modelId);
}
